package com.itmk.web.user_complaint.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itmk.utils.ResultUtils;
import com.itmk.utils.ResultVo;
import com.itmk.web.user_complaint.entity.UserComplaint;
import com.itmk.web.user_complaint.entity.UserComplaintParm;
import com.itmk.web.user_complaint.service.UserComplaintService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * 投诉管理模块控制器
 */
@RestController
@RequestMapping("/api/userComplaint")
public class UserComplaintController {

    @Autowired
    private UserComplaintService userComplaintService; // 注入投诉服务

    /**
     * 获取投诉列表
     * @param parm 查询参数，包含标题、投诉内容、状态等
     * @return 返回查询结果
     */
    @GetMapping("/list")
    public ResultVo getList(UserComplaintParm parm) {
        // 构造查询条件
        QueryWrapper<UserComplaint> query = new QueryWrapper<>();
        query.lambda().like(UserComplaint::getTitle, parm.getTitle())
                .like(UserComplaint::getComplaintContent, parm.getComplaintContent())
                .like(UserComplaint::getStatus, parm.getStatus());
        // 构造分页对象
        IPage<UserComplaint> page = new Page<>();
        page.setCurrent(parm.getCurrentPage()); // 设置当前页
        page.setSize(parm.getPageSize()); // 设置每页大小
        // 执行分页查询
        IPage<UserComplaint> list = userComplaintService.page(page, query);
        return ResultUtils.success("查询成功", list); // 返回成功结果
    }

    /**
     * 编辑投诉信息
     * @param userComplaint 投诉对象
     * @return 返回编辑结果
     */
    @PutMapping
    @PreAuthorize("hasAuthority('sys:myUserComplaint:edit')" + "|| hasAuthority('sys:myUserComplaint:do')")
    public ResultVo edit(@RequestBody UserComplaint userComplaint) {
        // 更新投诉信息
        boolean save = userComplaintService.updateById(userComplaint);
        if (save) {
            return ResultUtils.success("编辑成功!"); // 返回成功结果
        }
        return ResultUtils.error("编辑失败!"); // 返回失败结果
    }

    /**
     * 获取我的投诉列表
     * @param parm 查询参数，包含用户ID、标题、投诉内容、状态等
     * @return 返回查询结果
     */
    @GetMapping("/myList")
    public ResultVo getMyList(UserComplaintParm parm) {
        // 构造查询条件
        QueryWrapper<UserComplaint> query = new QueryWrapper<>();
        query.lambda().like(UserComplaint::getTitle, parm.getTitle())
                .like(UserComplaint::getStatus, parm.getStatus())
                .like(UserComplaint::getComplaintContent, parm.getComplaintContent())
                .eq(UserComplaint::getUserId, parm.getUserId()); // 根据用户ID查询
        // 构造分页对象
        IPage<UserComplaint> page = new Page<>();
        page.setCurrent(parm.getCurrentPage()); // 设置当前页
        page.setSize(parm.getPageSize()); // 设置每页大小
        // 执行分页查询
        IPage<UserComplaint> list = userComplaintService.page(page, query);
        return ResultUtils.success("查询成功", list); // 返回成功结果
    }

    /**
     * 新增投诉
     * @param userComplaint 投诉对象
     * @return 返回新增结果
     */
    @PostMapping
    @PreAuthorize("hasAuthority('sys:myUserComplaint:add')")
    public ResultVo add(@RequestBody UserComplaint userComplaint) {
        // 设置投诉状态为未处理
        userComplaint.setStatus("0");
        // 设置投诉时间为当前时间
        userComplaint.setCreateTime(new Date());
        // 保存投诉信息
        boolean save = userComplaintService.save(userComplaint);
        if (save) {
            return ResultUtils.success("反馈成功!"); // 返回成功结果
        }
        return ResultUtils.error("反馈失败!"); // 返回失败结果
    }

    /**
     * 删除投诉
     * @param complaintId 投诉ID
     * @return 返回删除结果
     */
    @PreAuthorize("hasAuthority('sys:myUserComplaint:delete')")
    @DeleteMapping("/{complaintId}")
    public ResultVo delete(@PathVariable("complaintId") Long complaintId) {
        // 根据ID删除投诉
        boolean save = userComplaintService.removeById(complaintId);
        if (save) {
            return ResultUtils.success("删除成功!"); // 返回成功结果
        }
        return ResultUtils.error("删除失败!"); // 返回失败结果
    }
}
